// pybind11/pybind11.h：这是 Pybind11 的主要头文件，提供了大部分 Pybind11 功能。
#include <pybind11/pybind11.h>
// pybind11/embed.h：这个头文件提供了嵌入 Python 解释器到 C++ 应用中所需的功能。这意味着你可以在 C++ 程序中启动和使用 Python 解释器。
#include <pybind11/embed.h>
#include <iostream>
 
// 创建了一个别名 py，代表 pybind11 命名空间，使得后续可以通过 py 来访问 pybind11 的各种功能。
namespace py = pybind11;
using namespace std;
 
int main() { 
    // 这里创建了一个 scoped_interpreter 实例。这个对象的生命周期控制着 Python 解释器的启动和关闭。
    // 当 guard 被创建时，Python 解释器启动；当 guard 的生命周期结束时（函数返回时），Python 解释器关闭。
    py::scoped_interpreter guard{};
 
    // 这几行代码导入了 Python 的 sys 模块，并使用 sys.path.append 方法添加了一个目录到 Python 的模块搜索路径中。
    // 这样，Pybind11 就可以找到并导入位于 /home/fairlee/Programs 目录下的 Python 脚本。
    py::module sys = py::module::import("sys");
    sys.attr("path").attr("append")("/home/awander/study.python/pybind11/cpp-call-python");
 
    // 上面的代码导入了名为 calc 的 Python 模块（假设这个模块位于之前添加到 sys.path 的目录中）。
    // 然后，它调用了 calc 模块中的 add_numbers 函数，传入两个参数（9 和 3.14），并将返回的结果转换为 double 类型。
    // 这里使用了 Pybind11 的 attr 方法来访问和调用 Python 中的属性和方法。
    py::module calc = py::module::import("calc");
    auto result = calc.attr("add_numbers")(9, 3.14).cast<double>();
 
    // 最后，使用标准输出将结果打印到控制台。这里的 result 就是从 Python 函数 add_numbers 返回的结果。
    std::cout << "9 + 3.14 = " << result << std::endl;
 
    return 0;
}
